package cn.jingyuan.swan.system.service;

import cn.jingyuan.swan.system.domain.sys.entity.Role;
import cn.jingyuan.swan.system.domain.sys.entity.RoleUser;

import java.util.Collection;
import java.util.List;

public interface RoleService {

    Role addRole(Role role);

    /**
     * 添加用户角色
     *
     * @param userId 用户 id
     * @param roles 角色 id
     */
    void saveUserRoles(Long userId, String... roles);

    void saveUserRoles(Long userId, Collection<String> roles);

    /**
     * 角色添加成员
     *
     * @param roleId 角色 id
     * @param userIds 用户 id
     */
    void saveRoleUsers(Long roleId, Long... userIds);

    /**
     * 角色添加成员
     *
     * @param roleId 角色 id
     * @param userIds 用户 id
     */
    void saveRoleUsers(Long roleId, Collection<Long> userIds);

    /**
     * 删除角色
     *
     * @param roleId 角色 id
     */
    void removeRole(Long roleId);

    /**
     * 移除角色所有组员
     *
     * @param roleId 角色 id
     */
    void removeRoleUsers(Long roleId);

    /**
     * 移除组员的所有角色
     *
     * @param userId 用户 id
     */
    void removeUserRoles(Long userId);

    /**
     * 更新角色
     *
     * @param role 更新参数
     *
     * @return 更新后的角色
     */
    Role updateRole(Role role);

    /**
     * 检测角色是否存在
     *
     * @param roleCode 角色编码
     *
     * @return true：存在，false：不存在
     */
    Boolean isExist(String roleCode);

    /**
     * 检测角色是否存在
     *
     * @param roleId 角色 id
     *
     * @return true：存在，false：不存在
     */
    Boolean isExist(Long roleId);

    /**
     * 检测用户角色是否存在
     *
     * @param userId 用户 id
     * @param roleId 角色 id
     *
     * @return true：存在，false：不存在
     */
    Boolean isExist(Long userId, Long roleId);

    /**
     * 获取全部角色
     *
     * @return
     */
    List<Role> getRole();

    /**
     * 获取角色
     *
     * @param roleId 角色 id
     *
     * @return 角色
     */
    Role getRole(Long roleId);

    /**
     * 查询无效角色
     * <pre>
     *     1、未分配给任何用户
     * </pre>
     *
     * @return 角色
     */
    List<Role> findInvalidRoles();

    /**
     * 查询角色成员
     *
     * @param roleId 角色 id
     *
     * @return 角色成员
     */
    List<RoleUser> findRoleUsers(Long roleId);

    /**
     * 获取角色所有授权组员数量
     *
     * @param roleId 角色 id
     *
     * @return 角色授权数量
     */
    int countByRole(Long roleId);

    /**
     * 获取组员角色数量
     *
     * @param userId 用户 id
     *
     * @return 角色数量
     */
    int countByUser(Long userId);

    /**
     * 获取组员角色
     *
     * @param userId 用户 id
     *
     * @return 角色列表
     */
    List<Role> getUserRoles(Long userId);

    /**
     * 获取用户角色 Id 列表
     *
     * @param userId 用户 id
     *
     * @return 角色 Id 列表
     */
    List<Long> getUserRoleIds(Long userId);

}
